package com.wenx.v3openfeign.api;

import com.wenx.v3core.response.R;
import com.wenx.v3openfeign.api.fallback.SysUserRemoteInfraFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 用户远程服务接口
 * 
 * 通过 OpenFeign 暴露用户相关的服务接口，供认证服务调用
 * 支持系统用户和平台用户两种类型
 * 支持多种查询方式：用户名、邮箱、手机号
 */
@FeignClient(
    name = "v3-system",
    contextId = "sysUser",
    path = "/api/v3/sys/user/remote",
    fallbackFactory = SysUserRemoteInfraFallbackFactory.class
)
public interface SysUserRemoteInfra {

    /**
     * 根据标识符获取用户认证信息
     * 自动识别并按优先级查询：账户名 > 用户名 > 邮箱 > 手机号
     * 
     * @param identifier 用户标识符（可以是用户名、邮箱、手机号等）
     * @return 用户认证信息
     */
    @GetMapping("/auth-info")
    R getUserAuthInfo(@RequestParam("identifier") String identifier);

    /**
     * 根据用户名获取用户认证信息
     * 
     * @param username 用户名
     * @return 用户认证信息
     */
    @GetMapping("/auth-info/by-username/{username}")
    R getUserAuthInfoByUsername(@PathVariable("username") String username);

    /**
     * 根据账户名获取用户认证信息
     * 支持用户名、邮箱、手机号等多种方式
     * 
     * @param account 账户标识
     * @return 用户认证信息
     */
    @GetMapping("/auth-info/by-account")
    R getUserAuthInfoByAccount(@RequestParam("account") String account);

    /**
     * 根据邮箱获取用户认证信息
     * 
     * @param email 邮箱地址
     * @return 用户认证信息
     */
    @GetMapping("/auth-info/by-email")
    R getUserAuthInfoByEmail(@RequestParam("email") String email);

    /**
     * 根据手机号获取用户认证信息
     * 
     * @param phone 手机号
     * @return 用户认证信息
     */
    @GetMapping("/auth-info/by-phone")
    R getUserAuthInfoByPhone(@RequestParam("phone") String phone);

    /**
     * 获取用户的所有权限标识
     * 
     * @param userId 用户ID
     * @return 权限标识集合
     */
    @GetMapping("/permissions/{userId}")
    R getUserPermissions(@PathVariable("userId") Long userId);

    /**
     * 获取用户的所有角色ID
     * 
     * @param userId 用户ID
     * @return 角色ID集合
     */
    @GetMapping("/roles/{userId}")
    R getUserRoles(@PathVariable("userId") Long userId);

    /**
     * 验证用户账户状态
     * 
     * @param userId 用户ID
     * @return 账户状态信息
     */
    @GetMapping("/account-status/{userId}")
    R isAccountActive(@PathVariable("userId") Long userId);


}
